//
// Description: 5977. 最少交换次数来组合所有的 1 II
// Created by Loading on 2022/1/9.
//

#include <bits/stdc++.h>

using namespace std;

int minSwaps(vector<int> &nums) {
    int n = nums.size();
    int cnt = 0;
    for (auto &x : nums) {
        if (x == 1) {
            ++cnt;
        }
    }
    int op = 0;
    // 第一个滑动窗口
    for (int i = 0; i < cnt; ++i) {
        if (!nums[i]) {
            op++;
        }
    }
    int res = op;
    // 逐渐向后滑动
    for (int i = 0; i < n; ++i) {
        /* 环形 */
        int next = (i + cnt) % n;
        // 即将滑出窗口的位置为 0，操作数减少
        if (!nums[i]) {
            --op;
        }
        // 即将加入窗口的位置为 0，操作数增加
        if (!nums[next]) {
            ++op;
        }
        // 取最优解
        res = min(res, op);
    }

    return res;
}

int main() {
    vector<int> nums = {0, 1, 0, 1, 1, 0, 0};
    int res = minSwaps(nums);
    cout << res << endl;

    return 0;
}
